home *** CD-ROM | disk | FTP | other *** search
- From: Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
- Date: Wed, 11 May 94 11:25:13 +0200
- Message-Id: <9405110925.AA14720@issan.informatik.uni-dortmund.de>
- To: mint@atari.archive.umich.edu
- Subject: wait4 for the MiNTlib
-
- This is an implementation of wait4 for the MiNTlib. Nothing special.
-
- ------------------------- cut here -------------------------
- /* wait4() emulation for MiNT, by Andreas Schwab. From wait3.c by
- Eric R. Smith */
-
- #include <types.h>
- #include <wait.h>
- #include <time.h>
- #include <resource.h>
- #include <mintbind.h>
- #include <errno.h>
- #include <signal.h>
-
- extern int __mint;
-
- extern long __waitval; /* in thread.c */
- extern long __waittime; /* ditto */
-
- __EXTERN void _bzero __PROTO ((void *, unsigned long));
-
- /* in getrusage.c */
- __EXTERN void _ms2tval __PROTO ((unsigned long, struct timeval *));
-
- pid_t
- wait4 (pid, status, options, rusage)
- pid_t pid;
- union wait *status;
- int options;
- struct rusage *rusage;
- {
- long r, rsc[8];
- int exit_status, sig_term;
-
- if (__mint == 0)
- {
- r = __waitval;
- __waitval = -ENOENT;
- rsc[0] = __waittime;
- rsc[1] = rsc[4] = 0;
- }
- else
- r = Pwaitpid (pid, options, rsc);
- if (r < 0)
- {
- errno = (int) -r;
- return -1;
- }
- pid = (int) ((r & 0xffff0000L) >> 16);
- if (pid)
- {
- if (status)
- {
- status->_i = 0;
-
- if ((short) r == -32)
- {
- sig_term = SIGINT;
- exit_status = 0;
- }
- else
- {
- exit_status = (int) r & 0xff;
- sig_term = ((int) r & 0x7f00) >> 8;
- }
- if (sig_term >= NSIG)
- sig_term = 0;
- if (sig_term && exit_status != 0 && exit_status != 0177)
- sig_term = 0;
- if (exit_status == 0177 && sig_term)
- {
- status->w_termsig = WSTOPPED;
- status->w_stopsig = sig_term;
- }
- else
- {
- status->w_termsig = sig_term;
- status->w_retcode = exit_status;
- }
- }
- if (rusage)
- {
- _bzero (rusage, (unsigned long) sizeof (struct rusage));
- _ms2tval (rsc[0], &rusage->ru_utime);
- _ms2tval (rsc[1], &rusage->ru_stime);
- }
- }
- return pid;
- }
- ------------------------- cut here -------------------------
-